package com.linkgie.galaxyframework.utils.io;

import java.io.ByteArrayInputStream;
import java.io.Closeable;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import com.linkgie.galaxyframework.utils.BinaryUtils;

public interface ZipFileSystem extends Closeable {

	default void create(String path, byte[] content) {
		create(path, new ByteArrayInputStream(content));
	}
	
	default String readString(String path) {
		return readString(path, "UTF-8");
	}
	
	default String readString(String path, String charset) {
		byte[] bytes = readBytes(path);
		try {
			return new String(bytes, charset);
		} catch (UnsupportedEncodingException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
	}

	default byte[] readBytes(String path) {
		InputStream in = read(path);
		return BinaryUtils.readBytes(in);
	}
	
	boolean exist(String path);
	

	/**
	 * 列出指定路径下的直接子项；
	 * <p>
	 * 此操作不进行递归检索；
	 * @param path
	 * @return
	 */
	String[] list(String path);

	/**
	 * 读取；
	 * 
	 * @param path
	 * @return
	 */
	InputStream read(String path);

	void create(String path, InputStream in);
	
	/**
	 * 写入文件；
	 * <p>
	 * 如果文件已经存在，则覆盖文件；
	 * 
	 * @param path
	 * @param content
	 */
	default void write(String path, String content) {
		write(path, content, "UTF-8");
	}
	
	/**
	 * 写入文件；
	 * <p>
	 * 如果文件已经存在，则覆盖文件；
	 * 
	 * @param path
	 * @param content
	 */
	default void write(String path, String content, String charset) {
		try {
			write(path, new ByteArrayInputStream(content.getBytes(charset)));
		} catch (UnsupportedEncodingException e) {
			throw new IllegalArgumentException(e.getMessage(), e);
		}
	}

	/**
	 * 写入文件；
	 * <p>
	 * 如果文件已经存在，则覆盖文件；
	 * 
	 * @param path
	 * @param content
	 */
	default void write(String path, byte[] content) {
		write(path, new ByteArrayInputStream(content));
	}

	/**
	 * 写入文件；
	 * <p>
	 * 如果文件已经存在，则覆盖文件；
	 * 
	 * @param path
	 * @param in
	 */
	void write(String path, InputStream in);

	/**
	 * 写入文件；
	 * <p>
	 * 如果文件已经存在，则覆盖文件；
	 * 
	 * @param path
	 * @param content
	 */
	default void append(String path, byte[] content) {
		append(path, new ByteArrayInputStream(content));
	}

	/**
	 * 写入文件；
	 * <p>
	 * 如果文件已经存在，则覆盖文件；
	 * 
	 * @param path
	 * @param in
	 */
	void append(String path, InputStream in);

	/**
	 * 删除；
	 * 
	 * @param path
	 */
	void delete(String path);

	/**
	 * 删除全部；
	 * <p>
	 * 如果指定路径是文件，则删除文件；
	 * <p>
	 * 如果指定路径是目录，则删除目录下所有内容，包括子目录；
	 * @param path
	 */
	void deleteAll(String path);

	@Override
	void close();

}
